Подтвердить что ты не робот

Доступ к веб-элементам селена с помощью python

Я уверен, что на это был дан ответ, потому что это очень простой вопрос - я не могу, однако, из-за жизни меня найти ответ в Интернете. Я чувствую себя полным идиотом, но я должен спросить об этом, вот идет:

Я пишу код python, который создаст список всех адресов страниц в домене. Это делается с использованием селена 2 - моя проблема возникает, когда я пытаюсь получить доступ к списку всех ссылок, созданных селеном.

Вот что я до сих пор:

from selenium import webdriver
import time

HovedDomene = 'http://www.example.com'
Listlinker = []
Domenesider = []
Domenesider.append(HovedDomene)

driver = webdriver.Firefox()

for side in Domenesider:        

        driver.get(side)
        time.sleep(10)
        Listlinker = driver.find_elements_by_xpath("//a")

        for link in Listlinker: 

            if link in Domenesider:
              pass
            elif str(HovedDomene) in str(link):
              Domenesider.append(side)

print(Domenesider)
driver.close()

переменная Listlinker не содержит ссылок, найденных на странице - вместо этого список содержит (я угадываю здесь) селеновые конкретные объекты, называемые WebElements. Однако я не могу найти атрибуты WebElement, которые дадут мне ссылки - на самом деле я не могу найти примеры атрибутов WebElement, к которым обращаются в python (по крайней мере, не так, как я могу воспроизвести)

Я бы очень признателен за любую помощь, которую вы могли бы мне дать.

С уважением Rookie

4b9b3361

Ответ 1

Я знаком с python api селена но вы, вероятно, можете получить ссылку, используя метод get_attribute(attributename). Поэтому это должно быть что-то вроде:

linkstr = ""
for link in Listlinker: 
  linkstr = link.get_attribute("href")

  if linkstr in Domenesider:
    pass
  elif str(HovedDomene) in linkstr:
    Domenesider.append(side)

Ответ 2

Я проверял ваш совет, чтобы не использовать time.sleep(10) в качестве ожидания загрузки страницы. Из чтения разных сообщений мне кажется, что ожидание загрузки страницы избыточно с селеном 2. Se, например, ссылка Причина в том, что селен 2 имеет неявное ожидание функции загрузки. Просто подумал, что я упомянул об этом тебе, потому что ты нашел время, чтобы ответить на мой вопрос.

Иногда селен ведет себя неясным образом. И иногда селен вызывает ошибки, которые нас не интересуют.

By byCondition;
T result; // T is IWebElement
const int SELENIUMATTEMPTS = 5;
int timeout = 60 * 1000;
StopWatch watch = new StopWatch();

public T MatchElement<T>() where T : IWebElement
{
    try
    {
        try {
            this.result = this.find(WebDriver.Instance, this.byCondition);
        }
        catch (NoSuchElementException) { }

        while (this.watch.ElapsedMilliseconds < this.timeout && !this.ReturnCondMatched)
        {

            Thread.Sleep(100);
            try {
                this.result = this.find(WebDriver.Instance, this.byCondition);
            }
            catch (NoSuchElementException) { }
        }
    }
    catch (Exception ex)
    {
        if (this.IsKnownError(ex))
        {
            if (this.seleniumAttempts < SELENIUMATTEMPTS)
            {
                this.seleniumAttempts++;
                return MatchElement();
            }
        }
        else { log.Error(ex); }
    }
    return this.result;
    }

    public bool IsKnownError(Exception ex)
    {
    //if selenium find nothing it throw an exception. This is bad practice to my mind.
    bool res = (ex.GetType() == typeof(NoSuchElementException));

    //OpenQA.Selenium.StaleElementReferenceException: Element not found in the cache
    //issue appears when selenium interact with other plugins.
    //this is probably something connected with syncronization
    res = res || (ex.GetType() == (typeof(InvalidSelectorException) && ex.Message
        .Contains("Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE)" +
                "[nsIDOMXPathEvaluator.createNSResolver]"));

    //OpenQA.Selenium.StaleElementReferenceException: Element not found in the cache
    res = res || (ex.GetType() == typeof(StaleElementReferenceException) && 
        ex.Message.Contains("Element not found in the cache"));

    return res;
}

Извините за С#, но я новичок в Python. Конечно, код упрощается.