【问题标题】:Click on random link via node.js and webdriver通过 node.js 和 webdriver 点击随机链接
【发布时间】:2014-08-14 01:23:27
【问题描述】:

我有一些包含不同产品的页面,应该随机选择其中一个。 我已经对 javascript 进行了测试,但是在尝试使用 node.js 和 selenium 编写它时遇到了问题。

在我的测试页面上,我得到了下一个结构

<div class="products">
    <table width="600" cellspacing="6">
        <tbody>
            <tr>
                <td>
                    <a href="phones-59.php"></a>
                </td>
                <td>...
                </td>
            </tr>
            <tr>...</tr>
...

所以下一个示例正在使用 javascript,我得到了我需要的所有链接

   links = document.getElementById('products').getElementsByTagName('a');

然后我使用随机并选择一些链接,类似这样(在此处获取示例Choosing a link at random

   randomlink = Math.round(Math.random() * (links.length+1));
   links[randomlink].click();

没什么特别的,但是当我在 node.js 中尝试过这种技巧时,我无法访问链接。尝试使用 click() 和其他函数时出现错误

driver.findElement(webdriver.By.id('products')).findElements(webdriver.By.tagName('a'));

那么我如何点击“产品”块中的随机链接? 谢谢

PS 我已经从 firefox 开发者控制台复制了“唯一选择器”,但不知道如何正确使用它(我尝试使用 xpath 没有成功)

"products > table:nth-child(1) > tbody:nth-child(1)"

更新 我也尝试过这样的构造并获得正确数量的链接,但无法访问它们

ll = driver.findElement(webdriver.By.id('products'));
lk = ll.findElements(webdriver.By.tagName('a')).then(function(txt) {
    logger.info("lk length: " + txt.length); });

【问题讨论】:

    标签: javascript node.js selenium selenium-webdriver


    【解决方案1】:

    这很奇怪 :) 但它有效

    Bing.Com 示例

    var webdriver = require('selenium-webdriver');
    var logger = require('winston');
    
    driver.get('http://bing.com');
    driver.findElements(webdriver.By.tagName('a')).then(function(elems){
        logger.info("links count: " + elems.length);
        rnd = Math.round(Math.random() * (elems.length+1));
        logger.info("rnd number: " + rnd);
    
        elems[rnd].getText().then(function(textValue){
            logger.info("link name: " + textValue);
        });
    
        elems[rnd].then(function (elem) {
            elem.click();
        });
    });
    

    我在这里找到答案Node.js + Selenium How to parse html properly

    【讨论】:

    • 显然“elems”应该有一个 randomElement 属性,这会使这变得更简单
    【解决方案2】:

    您能否编辑 html 并为每个链接分配自己的唯一 ID?我会这样做,然后创建一个包含所有 ID 的数组。选择一个随机 ID,然后使用 driver.findElement(webdriver.By.id(randomID[x])).click();

    如果您没有编辑 html 的权限,您可以使用 xpath 执行类似的操作。将所有唯一的 xpath 选择器添加到数组中,而不是 findElement(webdriver.by.id(randomID[x])) 使用 findelement(webdriver.by.xpath(randomXpath[x]));

    对不起,如果我没有得到完全正确的语法...我通常在 C# 中使用 selenium。

    希望这会有所帮助!

    【讨论】:

    • 如果我无权编辑源 html,您能否在 c# 上展示如何向我的链接添加 ID 的示例?
    • 对不起,这不是我想要的。如果无法访问源代码,则无法将 HTML id 添加到标签中。尝试我的第二种方法,在您尝试测试的页面上,手动获取所有可能性的 xpath 并将它们硬编码到一个数组中。从该数组中选择一个随机索引并执行 findelement(webdriver.by.xpath()) 而不是按 ID。
    猜你喜欢
    • 2013-02-06
    • 2018-03-24
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多